import { useParams } from 'common' import { parseAsArrayOf, parseAsInteger, parseAsJson, parseAsString, useQueryStates } from 'nuqs' import { Admonition } from 'ui-patterns' import { useIndexAdvisorStatus } from '@/components/interfaces/QueryPerformance/hooks/useIsIndexAdvisorStatus' import { useQueryPerformanceSort } from '@/components/interfaces/QueryPerformance/hooks/useQueryPerformanceSort' import { QueryPerformance } from '@/components/interfaces/QueryPerformance/QueryPerformance' import { type QuerySource } from '@/components/interfaces/QueryPerformance/QueryPerformance.types' import { useQueryPerformanceInfiniteQuery } from '@/components/interfaces/QueryPerformance/useQueryPerformanceQuery' import { PRESET_CONFIG } from '@/components/interfaces/Reports/Reports.constants' import { Presets } from '@/components/interfaces/Reports/Reports.types' import { queriesFactory } from '@/components/interfaces/Reports/Reports.utils' import { NumericFilter } from '@/components/interfaces/Reports/v2/ReportsNumericFilter' import { DefaultLayout } from '@/components/layouts/DefaultLayout' import ObservabilityLayout from '@/components/layouts/ObservabilityLayout/ObservabilityLayout' import { DatabaseSelector } from '@/components/ui/DatabaseSelector' import { DocsButton } from '@/components/ui/DocsButton' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' import { DOCS_URL } from '@/lib/constants' import type { NextPageWithLayout } from '@/types' const QueryPerformanceReport: NextPageWithLayout = () => { const { ref } = useParams() const { data: project, isLoading: isLoadingProject } = useSelectedProjectQuery() const { isIndexAdvisorEnabled } = useIndexAdvisorStatus() const { sort: sortConfig } = useQueryPerformanceSort() const [ { search: searchQuery, roles, sources, minCalls, totalTimeFilter: totalTimeFilterRaw, indexAdvisor, }, ] = useQueryStates({ sort: parseAsString, order: parseAsString, search: parseAsString.withDefault(''), roles: parseAsArrayOf(parseAsString).withDefault([]), sources: parseAsArrayOf(parseAsString).withDefault([]), minCalls: parseAsInteger, totalTimeFilter: parseAsJson((value) => value === null || value === undefined ? null : (value as NumericFilter) ), indexAdvisor: parseAsString.withDefault('false'), }) const totalTimeFilter = totalTimeFilterRaw ?? null const config = PRESET_CONFIG[Presets.QUERY_PERFORMANCE] const hooks = queriesFactory(config.queries, ref ?? 'default') const queryHitRate = hooks.queryHitRate() const queryMetrics = hooks.queryMetrics() const minTotalTime = totalTimeFilter && totalTimeFilter.operator === '>' ? totalTimeFilter.value : totalTimeFilter && totalTimeFilter.operator === '>=' ? totalTimeFilter.value : undefined const queryPerformanceQuery = useQueryPerformanceInfiniteQuery({ searchQuery, orderBy: sortConfig || undefined, preset: 'unified', roles, sources: sources as QuerySource[], runIndexAdvisor: isIndexAdvisorEnabled, minCalls: minCalls ?? undefined, minTotalTime, filterIndexAdvisor: indexAdvisor === 'true', }) if (!isLoadingProject && !project) { return (
) } return (

Query Performance

) } QueryPerformanceReport.getLayout = (page) => ( {page} ) export default QueryPerformanceReport